package reversi;

import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * Klasa <code>ReversiServer</code>> jest klasą umożliwiającą postawienie prostego serwera
 * obsługującego kilka toczonych gier w Reversi.
 * 
 * @author Sebastian Gabor
 * @version 0.1
 *
 */
public class ReversiServer {
	/**
	 * Konstruktor klasy ReversiServer inicjalizuje odpowiednie gniazdko.
	 */
	public ReversiServer() {
		game=Collections.synchronizedList(new ArrayList<ReversiGame>());
		ended_games=Collections.synchronizedList(new ArrayList<String>());
		try {
			serverSocket = new ServerSocket(4444);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		Thread t;
		t=new Thread(new Runnable(){

			@Override
			public void run() {
				ReversiGame rg;
				while (true){
					try {
						Thread.sleep(5000);
						for (String gam: ended_games){
							
							rg=getGame(gam);
							if (rg!=null){
								game.remove(rg);
							}
						}
							
						
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
				
			}});
		t.setDaemon(true);
	//	t.start();
	}
	
	/**
	 * Wprowadza serwer w nieskończoną pętlę nasłuchującą.
	 */
	public void listen(){

			
		
        while (listening)
			try {
				new Thread(new ReversiServerThread(serverSocket.accept(),this)).start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

        
		
	}
	/**
	 * Dodaje nową grę do kontenera gier.
	 * @param agame referencja do obiektu przechowującego grę
	 */
	public synchronized void addGame(ReversiGame agame){
		game.add(agame);
	}
	public synchronized boolean deleteGame(String aname, String apass){
		if (getGame(aname,apass)!=null){
			ended_games.add(aname);
			return true;
		}
		return false;
	}
	public synchronized boolean setMoveToGame(String aname, String move){
		for (ReversiGame rg: game){
			if (rg.getName().equals(aname)){
				return rg.setMove(move);
			}			
		}
		return false;
	}
	public synchronized ReversiGame getGame(String aname, String apass){
		
		for (ReversiGame rg: game){
			if (rg.getName().equals(aname)&&rg.getPass().equals(apass)){
				return rg;
			}			
		}
		return null;
	}
	private synchronized ReversiGame getGame(String aname){
		for (ReversiGame rg: game){
			if (rg.getName().equals(aname)){
				return rg;
			}			
		}
		return null;
	}
	/**
	 * 
	 * @param adone ustawia zmienną logiczną mówiącą o zakończeniu ruchu.
	 */
	public synchronized void setDone(boolean adone){	
	
	}
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ReversiServer rs = new ReversiServer();
		rs.listen();

	}
    private ServerSocket serverSocket = null;
    private boolean listening = true;
    private List<ReversiGame> game;
    private List<String> ended_games;
    
    
    

}
